//
//  CZRefreshControl.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/23.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit

enum CZRefreshControlState: Int {
    
    case Normal = 0 //"默认状态"
    case Pulling = 1 // "松手就去刷新的状态"
    case Refreshing = 2 //"刷新的状态"
    
    
}


//设置刷新控件的高度的
private let CZRefreshControlH: CGFloat = 50
class CZRefreshControl: UIControl {
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    var tableView: UIScrollView?
    //属性记录当前控件的状态
    var htState: CZRefreshControlState = .Normal {
        didSet{
            
            //根据状态来设置图片的样式
            
            switch htState{
            case .Pulling:
                //箭头朝上
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    
                    self.arrowImage.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                })
            
                //2.文字的名字改为松手起飞
                tipLabel.text = "松手起飞"
            
            
            case .Refreshing:
                
                //刷新状态,如何呢
                //1.影藏箭头
                arrowImage.hidden = true
                
                //2.显示菊花,并让他旋转
                indicatorView.startAnimating()
                
                //3.文字变为正在起飞
                tipLabel.text = "正在起飞"
                //注意refresh的状态是松手刷新,注意松手刷新为了让他不自动回去,给他一个让他定格住
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    //将tableView的内容在往下移动,注意这里的tableView是可选的运算的时候必须装换
                    self.tableView!.contentInset.top = self.tableView!.contentInset.top + CZRefreshControlH
                })
                //调用刷新的方法
                
                sendActionsForControlEvents(.ValueChanged)
                
                
            case .Normal:
                //影藏菊花
                indicatorView.stopAnimating()
                
                self.arrowImage.hidden = false
                
                //2.显示箭头朝下
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    //直接回复原来的状态
                    self.arrowImage.transform = CGAffineTransformIdentity
                })
                //3.更改文字为起飞
                tipLabel.text = "等待起飞"
                //如果之前是刷新状态,那么进入到noraml状态就减去顶部多出来的滑动的距离
                //这个估计是等到数据刷新完调用的方法才会将其改变成normal状态
                
                if oldValue == .Refreshing {
                    UIView.animateWithDuration(0.25, animations: { () -> Void in
                        self.tableView?.contentInset.top = self.tableView!.contentInset.top - CZRefreshControlH
                    })
                }
                
            
            }
        }
        
        
    }
    
    //给外界提供一个结束刷新的方法
    func endRefresh(){
        
        htState = .Normal
        
        //本来在这里提供一个方法进行判断
//        if htState == .Refreshing {
//            //什么情况下需要去减去contentInset.top??->当前状态如果是刷新中的状态的话
//            UIView.animateWithDuration(0.25, animations: { () -> Void in
//                
//                self.tableView?.contentInset.top = self.tableView!.contentInset.top - CZRefreshControlH
//            })
        
            
//        }
        
    }
    
    private func setupUI(){
        //设置界面,里面有什么属性,设置本省的大小
        self.frame.size.height = CZRefreshControlH
        
        backgroundColor = UIColor.orangeColor()
        self.frame.size.width = SCREENW
        
        //设置控件的y值
        self.frame.origin.y = -CZRefreshControlH
        
        //添加控件
        addSubview(arrowImage)
        addSubview(tipLabel)
        addSubview(indicatorView)
        //设置约束
        
        arrowImage.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self).offset(-35)
            make.centerY.equalTo(self)
        }
        
        tipLabel.snp_makeConstraints { (make) -> Void in
            make.leading.equalTo(arrowImage.snp_trailing)
            make.centerY.equalTo(arrowImage)
        }
        
        indicatorView.snp_makeConstraints { (make) -> Void in
            make.center.equalTo(arrowImage)
        }
        

        
        
    }
    
    //这个控件被添加到view上就会调用下面这个方法
    override func willMoveToSuperview(newSuperview: UIView?) {
        //注意这里需要调用父类的方法
        super.willMoveToSuperview(newSuperview)
        
        
        //取到他的父view,添加对应的监听事件,设置本身的宽度
        
        guard let tableView = newSuperview where tableView.isKindOfClass(UIScrollView.self) else{
            return
        }
        //来到这里说明fu view是scrollView
        self.tableView = tableView as? UIScrollView
        self.frame.size.width = tableView.frame.size.width
        
        //使用kvo来监听tableview的滚动
      
        tableView.addObserver(self, forKeyPath: "contentOffset", options: [.New], context: nil)
        
        
        
        
        
    }
//监听tableView的滚动
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        //监听tableView的滚动,来设置最上面的view的状态
        //枚举设置他的三种状态
        
        //获取tableView的contentOffset
        let contentOffset = tableView!.contentOffset
        
        //设置他的完全显示出来的最大距离
        let conditionValue = -CZRefreshControlH - tableView!.contentInset.top
        
        if tableView!.dragging {
            //tableView在滚动,y为﹣值,-的越大,代表越小
            if contentOffset.y < conditionValue && htState == .Normal {
                //这个代表是pulling状态,pulling是松手即将刷新状态
                htState = .Pulling
                
                
                
            }else{
                
                //这个判断有毒
                
                if contentOffset.y > conditionValue && htState == .Pulling {
                    //这个代表,下拉的专题太这个代表什么呢,代表还没有下拉的状态,平常状态
                    
                    print("控件没有完全的显示出来")
                    htState = .Normal
                }
                
                
                
            }
            
            
            
            
        }else{
            //用户没有拖动,松手,检查当前的状态是否是pulling状态,如果是就进行刷新状态
            
            //不在拖动状态,有可能是松手状态,还有可能是normal状态
            if htState == .Pulling {
                print("控件进行刷新中")
                //并且当前的状态是松手就去刷新的话,就进行刷新中的状态
                htState = .Refreshing
            }
            
            
            
            
        }
        
        
        
        
        
    }
    
    //移除监听者
    deinit{
        
        tableView?.removeObserver(self, forKeyPath: "contentOffset")
        
    }
    
    
    
    //懒加载箭头控件
    private lazy var arrowImage: UIImageView = UIImageView(image: UIImage(named: "tableview_pull_refresh"))
    //label
    private lazy var tipLabel: UILabel  = {
       
        let label = UILabel(textColor: UIColor.darkGrayColor(), fontSize: 12)
        label.text = "等待起飞"
        
        return label
        
        
    }()
    //菊花,注意菊花的控件,是系统的控件
    private lazy var indicatorView: UIActivityIndicatorView = UIActivityIndicatorView()
    
    
    

}
